リソースレベルのRDSコストをAWS CLIから確認する【Cost Explorer】
現在、いちプロジェクトにてRDSのコスト最適化を推進しています。 コスト可視化のための1ツールとして Cost Explorer を活用しています。
Cost Explorer を使うとAWSコストの遷移を調査できます。 使用タイプやデータベースエンジンなどでグループ化/フィルタが可能です。 またオプトインの機能として、リソースごとのグループ化/フィルタもできます。
本ブログでは リソースレベルのRDSコストを AWS CLI から確認 してみます。 今後、機械的にレポートを作成することを見越しています。
前提
Cost Explorer のリソースレベル可視化はオプトインが必要です。
画像引用: AWS Cost Explorer【AWS Black Belt】 - YouTube
また、リソースレベルのデータは 過去14日間のみのサポートです。 それよりも遡って確認したい場合は Cost and Usage Reports(CUR) の利用を検討ください。
RDSリソースごとにグループ化したコストを確認する
まずはRDSリソースでグループ化したコストを AWS CLI から出力してみます。
Cost Explorer(ce)の get-cost-and-usage-with-resources コマンドを使います。 リソースごとにグループ化するには group-by パラメータに Type=DIMENSION,Key=RESOURCE_ID
を指定します。
以下、1週間前(1日分)のRDSコストをリソース別で取得するコマンド例です。
### 取得する日付の設定
# ※ macOS の date コマンドの場合は date -v-7d +%Y-%m-%d みたいに書く
date_start=$(date '+%Y-%m-%d' --date '7 days ago')
date_end=$(date '+%Y-%m-%d' --date '6 days ago')
### フィルターの設定
ce_filter=$(cat <<EOF
{
"Dimensions": {
"Key": "SERVICE",
"Values": ["Amazon Relational Database Service"],
"MatchOptions": ["EQUALS"]
}
}
EOF
)
### RDSリソース別のコスト情報を取得する
# ※特に割引やRI購入がない場合、 metrics は UnblendedCost(非ブレンドコスト) でOK
aws ce get-cost-and-usage-with-resources --output yaml \
--time-period Start="${date_start}",End="${date_end}" \
--granularity DAILY \
--metrics NetAmortizedCost \
--group-by Type=DIMENSION,Key=RESOURCE_ID \
--filter "${ce_filter}"
DimensionValueAttributes: []
GroupDefinitions:
- Key: RESOURCE_ID
Type: DIMENSION
ResultsByTime:
- Estimated: true
Groups:
- Keys:
- NoResourceId
Metrics:
NetAmortizedCost:
Amount: '16.1234123412'
Unit: USD
- Keys:
- arn:aws:rds:ap-northeast-1:111111111111:db:example-db1
Metrics:
NetAmortizedCost:
Amount: '0.6123123412'
Unit: USD
- Keys:
- arn:aws:rds:ap-northeast-1:111111111111:cluster-snapshot:example-cluster1
Metrics:
NetAmortizedCost:
Amount: '0.7237904232'
Unit: USD
# ーー略ーー
- Keys:
- arn:aws:rds:ap-northeast-1:111111111111:db:example-dbn
Metrics:
NetAmortizedCost:
Amount: '4.8534123412'
Unit: USD
TimePeriod:
End: '2024-11-07T00:00:00Z'
Start: '2024-11-06T00:00:00Z'
Total: {}
これはマネジメントコンソールの以下画面の結果と同じです。
もう少し整形して、見やすくしてみます。 以下、上位10リソースを tsv として出力するサンプルスクリプトです。
### 取得する日付の設定
# ※ macOS の date コマンドの場合は date -v-7d +%Y-%m-%d みたいに書く
date_start=$(date '+%Y-%m-%d' --date '7 days ago')
date_end=$(date '+%Y-%m-%d' --date '6 days ago')
### フィルターの設定
ce_filter=$(cat <<EOF
{
"Dimensions": {
"Key": "SERVICE",
"Values": ["Amazon Relational Database Service"],
"MatchOptions": ["EQUALS"]
}
}
EOF
)
### クエリの設定
ce_query=$(cat <<EOF
ResultsByTime[0].Groups[].[
Keys[0],
Metrics.NetAmortizedCost.Amount,
Metrics.NetAmortizedCost.Unit
]
EOF
)
### RDSリソース別のコスト情報を取得して、上位10リソースを tsv として出力する
# ※特に割引やRI購入がない場合、 metrics は UnblendedCost(非ブレンドコスト) でOK
echo "Key\tAmount\tUnit"
aws ce get-cost-and-usage-with-resources --output text \
--time-period Start="${date_start}",End="${date_end}" \
--granularity DAILY \
--metrics NetAmortizedCost \
--group-by Type=DIMENSION,Key=RESOURCE_ID \
--filter "${ce_filter}" \
--query "${ce_query}" \
| sort -k 2 -nr \
| head -n 10
Key Amount Unit
arn:aws:rds:ap-northeast-1:111111111111:db:example-db1 33.3091116083 USD
arn:aws:rds:ap-northeast-1:111111111111:cluster:example-cluster1 32.3128333333 USD
arn:aws:rds:ap-northeast-1:111111111111:cluster:example-cluster2 29.1794444407 USD
NoResourceId 14.0240000702 USD
arn:aws:rds:ap-northeast-1:111111111111:db:example-db3 9.3360444441 USD
arn:aws:rds:ap-northeast-1:111111111111:db:example-db4 9.3360000006 USD
arn:aws:rds:ap-northeast-1:111111111111:db:example-db5 5.9113333456 USD
arn:aws:rds:ap-northeast-1:111111111111:db:example-db6 4.8522222274 USD
arn:aws:rds:ap-northeast-1:111111111111:db:example-db7 4.2522222812 USD
arn:aws:rds:ap-northeast-1:111111111111:cluster-snapshot:example-snapshot 1.555500008 USD
特定リソースのコスト内訳(使用タイプ)を確認する
次は、「あるRDSリソースに掛かっているコスト」を 使用タイプごとにグループ化して出力してみます。
同じく get-cost-and-usage-with-resources コマンドを使います。 filter パラメータに RESOURCE_ID
を指定して、 その値に「対象RDSリソースのARN」を記載します。
そして、group-by パラメータには Type=DIMENSION,Key=USAGE_TYPE
を指定します。
### 取得するリソースのARNを設定
resource_arn="arn:aws:rds:ap-northeast-1:111111111111:db:example-db1"
### 取得する日付の設定
# ※ macOS の date コマンドの場合は date -v-7d +%Y-%m-%d みたいに書く
date_start=$(date '+%Y-%m-%d' --date '7 days ago')
date_end=$(date '+%Y-%m-%d' --date '6 days ago')
### フィルターの設定
ce_filter=$(cat <<EOF
{
"Dimensions": {
"Key": "RESOURCE_ID",
"Values": ["${resource_arn}"],
"MatchOptions": ["EQUALS"]
}
}
EOF
)
### 特定リソースの使用タイプごとのコスト情報を取得する
# ※特に割引やRI購入がない場合、 metrics は UnblendedCost(非ブレンドコスト) でOK
aws ce get-cost-and-usage-with-resources --output yaml \
--time-period Start="${date_start}",End="${date_end}" \
--granularity DAILY \
--metrics NetAmortizedCost \
--group-by Type=DIMENSION,Key=USAGE_TYPE \
--filter "${ce_filter}"
DimensionValueAttributes: []
GroupDefinitions:
- Key: USAGE_TYPE
Type: DIMENSION
ResultsByTime:
- Estimated: true
Groups:
- Keys:
- APN1-DataTransfer-In-Bytes
Metrics:
NetAmortizedCost:
Amount: '0'
Unit: USD
- Keys:
- APN1-DataTransfer-Out-Bytes
Metrics:
NetAmortizedCost:
Amount: '0.00000373333'
Unit: USD
- Keys:
- APN1-InstanceUsage:db.t3.medium
Metrics:
NetAmortizedCost:
Amount: '1.810222222'
Unit: USD
- Keys:
- APN1-RDS:ChargedBackupUsage
Metrics:
NetAmortizedCost:
Amount: '0.6583333861'
Unit: USD
- Keys:
- APN1-RDS:GP2-Storage
Metrics:
NetAmortizedCost:
Amount: '0.9199999992'
Unit: USD
- Keys:
- APN1-RDS:ProxyUsage
Metrics:
NetAmortizedCost:
Amount: '0.864'
Unit: USD
TimePeriod:
End: '2024-11-07T00:00:00Z'
Start: '2024-11-06T00:00:00Z'
Total: {}
これはマネジメントコンソールの以下画面の結果と同じです。
こちらについても、上位の使用タイプを tsv として出力するサンプルスクリプトを 作成してみます。
### 取得するリソースのARNを設定
resource_arn="arn:aws:rds:ap-northeast-1:111111111111:db:example-db1"
### 取得する日付を設定
# ※ macOS の date コマンドの場合は date -v-7d +%Y-%m-%d みたいに書く
date_start=$(date '+%Y-%m-%d' --date '7 days ago')
date_end=$(date '+%Y-%m-%d' --date '6 days ago')
### フィルターの設定
ce_filter=$(cat <<EOF
{
"Dimensions": {
"Key": "RESOURCE_ID",
"Values": ["${resource_arn}"],
"MatchOptions": ["EQUALS"]
}
}
EOF
)
### クエリの設定
ce_query=$(cat <<EOF
ResultsByTime[0].Groups[].[
Keys[0],
Metrics.NetAmortizedCost.Amount,
Metrics.NetAmortizedCost.Unit
]
EOF
)
### 特定リソースの使用タイプごとのコスト情報を取得して、上位10リソースを tsv として出力する
# ※特に割引やRI購入がない場合、 metrics は UnblendedCost(非ブレンドコスト) でOK
echo "Key\tAmount\tUnit"
aws ce get-cost-and-usage-with-resources --output text \
--time-period Start="${date_start}",End="${date_end}" \
--granularity DAILY \
--metrics NetAmortizedCost \
--group-by Type=DIMENSION,Key=USAGE_TYPE \
--filter "${ce_filter}" \
--query "${ce_query}" \
| sort -k 2 -nr \
| head -n 10
Key Amount Unit
APN1-InstanceUsage:db.t3.medium 1.81000006 USD
APN1-RDS:GP2-Storage 0.9199999992 USD
APN1-RDS:ProxyUsage 0.748 USD
APN1-RDS:ChargedBackupUsage 0.658444461 USD
APN1-DataTransfer-Out-Bytes 0.000003449 USD
APN1-DataTransfer-In-Bytes 0 USD
おわりに
リソースレベルのRDSコストを AWS CLI の Cost Explorer(ce) コマンドで確認してみました。
基本的にはマネジメントコンソールにて Cost Explorer を見るのが便利です。 繰り返し確認して共有するような項目がある場合は、 今回みたいに AWS CLI を活用して機械的に取得してみると良いかもしれません。
以上、参考になれば幸いです。
参考